GtkTreeView: Avoid interference with animation
authorMatthias Clasen <mclasen@redhat.com>
Mon, 14 Jul 2014 02:00:59 +0000 (22:00 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 14 Jul 2014 02:00:59 +0000 (22:00 -0400)
The animated scrolling interferes with incremental validation.
As short-term solution, disable scrolling animation during
incremental validation. This is not a proper solution, but
it avoids broken behavior like scrollbars that are not reacting
to clicks. The problem was visible, e.g. in the list view
example in gtk3-demo.

gtk/gtktreeview.c

index d11c3fdb52164b5c717c2d289d88bb3d1f84200e..e648ffc2b89bec3fbba709ea2081a27bd5b626b2 100644 (file)
@@ -6919,11 +6919,31 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
   return retval;
 }
 
+static void
+disable_adjustment_animation (GtkTreeView *tree_view)
+{
+  gtk_adjustment_enable_animation (tree_view->priv->vadjustment,
+                                   NULL,
+                                   gtk_adjustment_get_animation_duration (tree_view->priv->vadjustment));
+}
+
+static void
+maybe_reenable_adjustment_animation (GtkTreeView *tree_view)
+{
+  if (tree_view->priv->presize_handler_tick_cb != 0 ||
+      tree_view->priv->validate_rows_timer != 0)
+    return;
+
+  gtk_adjustment_enable_animation (tree_view->priv->vadjustment,
+                                   gtk_widget_get_frame_clock (GTK_WIDGET (tree_view)),
+                                   gtk_adjustment_get_animation_duration (tree_view->priv->vadjustment));
+}
+
 static gboolean
 do_presize_handler (GtkTreeView *tree_view)
 {
   if (tree_view->priv->mark_rows_col_dirty)
-    {
+   {
       if (tree_view->priv->tree)
        _gtk_rbtree_column_invalid (tree_view->priv->tree);
       tree_view->priv->mark_rows_col_dirty = FALSE;
@@ -6948,7 +6968,9 @@ do_presize_handler (GtkTreeView *tree_view)
                                 MAX (gtk_adjustment_get_upper (tree_view->priv->vadjustment), requisition.height));
       gtk_widget_queue_resize (GTK_WIDGET (tree_view));
     }
-                  
+
+  maybe_reenable_adjustment_animation (tree_view);
+
   return FALSE;
 }
 
@@ -6979,6 +7001,7 @@ validate_rows (GtkTreeView *tree_view)
     {
       g_source_remove (tree_view->priv->validate_rows_timer);
       tree_view->priv->validate_rows_timer = 0;
+      maybe_reenable_adjustment_animation (tree_view);
     }
 
   return retval;
@@ -6990,6 +7013,8 @@ install_presize_handler (GtkTreeView *tree_view)
   if (! gtk_widget_get_realized (GTK_WIDGET (tree_view)))
     return;
 
+  disable_adjustment_animation (tree_view);
+
   if (! tree_view->priv->presize_handler_tick_cb)
     {
       tree_view->priv->presize_handler_tick_cb =